// Kony


#include "AbilitySystem/Abilitys/BaseBlast.h"

#include "AbilitySystem/BaseAbilitySystemLibrary.h"
#include "Actor/BaseBlastBall.h"

//当前技能描述
FString UBaseBlast::GetDescription(int32 Level, const FText& Title, const FText& Description)
{
	const float ScaledDamage = Damage.GetValueAtLevel(Level);
	TArray<FStringFormatArg> Args;
	Args.Add(FStringFormatArg(FString::Printf(TEXT("%.1f"), ScaledDamage)));
	Args.Add(FStringFormatArg(FString::Printf(TEXT("%.1f"), FMath::Abs(GetManaCost(Level)))));
	Args.Add(FStringFormatArg(FString::Printf(TEXT("%.1f"), GetCooldown(Level))));
	Args.Add(FStringFormatArg(Level));
	Args.Add(FStringFormatArg(FMath::Min(Level, NumBalls)));
	
	return FormatAbilityDescription(Level, Title, Description, Args);
}
//下一级技能描述
FString UBaseBlast::GetNextLevelDescription(int32 Level, const FText& Title, const FText& Description)
{
	const float ScaledDamage = Damage.GetValueAtLevel(Level);
	TArray<FStringFormatArg> Args;
	Args.Add(FStringFormatArg(FString::Printf(TEXT("%.1f"), ScaledDamage)));
	Args.Add(FStringFormatArg(FString::Printf(TEXT("%.1f"), FMath::Abs(GetManaCost(Level)))));
	Args.Add(FStringFormatArg(FString::Printf(TEXT("%.1f"), GetCooldown(Level))));
	Args.Add(FStringFormatArg(Level));
	Args.Add(FStringFormatArg(FMath::Min(Level, NumBalls)));
	
	return FormatNextLevelDescription(Level, Title, Description, Args);
}
//生成爆炸球方法
TArray<ABaseBlastBall*> UBaseBlast::SpawnBlastBalls()
{
	TArray<ABaseBlastBall*> BlastBalls;
	//获取角色的前向向量，用于确定技能发射方向
	const FVector Forward = GetAvatarActorFromActorInfo()->GetActorForwardVector();
	//获取玩家角色位置
	FVector Location = GetAvatarActorFromActorInfo()->GetActorLocation();
	//调用旋转器函数,获取均匀间隔的旋转器
	TArray<FRotator> Rotators = UBaseAbilitySystemLibrary::EvenlySpacedRotators(Forward,FVector::UpVector,360.f,NumBalls);
	for (const FRotator& Rotator : Rotators)
	{
		//创建爆炸球的变换信息
		FTransform SpawnTransform;
		//设置生成位置为角色当前位置
		SpawnTransform.SetLocation(Location);
		//设置生成旋转角度，使用当前循环的旋转器
		SpawnTransform.SetRotation(Rotator.Quaternion());
		//延迟生成爆炸球对象，允许在完全生成前进行初始化设置
		ABaseBlastBall* BlastBall = GetWorld()->SpawnActorDeferred<ABaseBlastBall>(
			BlastBallClass,           // 要生成的类
			SpawnTransform,           // 生成的位置和旋转信息
			GetOwningActorFromActorInfo(),     // 拥有者
			CurrentActorInfo->PlayerController->GetPawn(),  // 生成的控制器关联的 pawn
			ESpawnActorCollisionHandlingMethod::AlwaysSpawn); // 碰撞处理方式：总是生成

		//获取自定义伤害效果参数
		BlastBall->DamageEffectParams = MakeDamageEffectParamsFromClassDefaults();
		//设置返回的目标角色
		BlastBall->ReturnToTarget = GetAvatarActorFromActorInfo();
		//设置法术拥有者 可用于获取范围内的敌人 制造群体伤害
		BlastBall->SetOwner(GetAvatarActorFromActorInfo());
		//设置爆炸球 爆炸伤害效果参数
		BlastBall->ExplosionDamageParams = MakeDamageEffectParamsFromClassDefaults();
		
		BlastBalls.Add(BlastBall);

		//完成爆炸球的生成过程，此时爆炸球已完全初始化并可以在场景中使用
		BlastBall->FinishSpawning(SpawnTransform);
	}
	return BlastBalls;
}
